package org.neg.usuario;

import org.conexao.ConnectionHandler;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author luiz.perez
 */
public class Usuario
{
    private String nome, email, senha, cep, telefone, dataNascimento, ra, curso, semestre, noRegistro, empresa, cargo, faculdade, graduacao;
    private int tipoCadastro;
    
    private ConnectionHandler ch = new ConnectionHandler();
    private Connection conn = null;
    private PreparedStatement stmt = null;
    private ResultSet rst = null;
        
    public ResultSet Login(String login, String senha)
    {
        conn = ch.Connect();
        try {
            stmt = conn.prepareStatement("SELECT * FROM ADMINDB2.\"Usuario\" WHERE \"Email\" = ? AND \"Senha\" = ?", ResultSet.TYPE_SCROLL_SENSITIVE,
                    ResultSet.CONCUR_READ_ONLY);
            stmt.setString(1, login);
            stmt.setString(2, senha);
            System.out.println("Statement preparado com sucesso.");
        } catch (SQLException ex) {
            Logger.getLogger(ConnectionHandler.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Criacao de statement falhou.");
        }
        try {
            rst = stmt.executeQuery();
            System.out.println("Query executada.");
            rst.last();
            System.out.println("Busca executada com sucesso. Encontrados " + rst.getRow() + " usuarios.");
            rst.beforeFirst();
        } catch (SQLException ex) {
            Logger.getLogger(ConnectionHandler.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Falha na execucao do statement.");
        }
        return rst;
    }
    /*
     * Metodo para cadastrar um novo usuario do tipo aluno. Recebe os dados comuns aos usuarios e ra, curso e semestre do aluno. Com isso cria um
     * statement SQL para inserir o novo aluno no banco. Para a data de nascimento eh neceessaria uma conversao especial, onde checamos se ela é nula
     * e, se nao for, a convertemos para um objeto SQL do tipo data.
     */
    public boolean novoAluno(String nome, String email, String senha, String cep, String tel, String dtNasc, String ra, String curso, String semestre)
    {
        conn = ch.Connect();
        try {
            // Statement SQL
            stmt = conn.prepareStatement("INSERT INTO ADMINDB2.\"Usuario\" (\"Nome\", \"Email\", \"Senha\", \"CEP\", \"Telefone\", \"DataNascimento\", " +
                    "\"Tipo\", \"RA\", \"Curso\", \"Semestre\", \"NoRegistro\", \"Empresa\", \"Cargo\", \"Faculdade\", \"Graduacao\") VALUES(?, " +
                    "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
            
            // Passagem de variaveis
            stmt.setString(1, nome);
            stmt.setString(2, email);
            stmt.setString(3, senha);
            stmt.setString(4, cep);
            stmt.setString(5, tel);
            // Conversao da data de nascimento
            if(dtNasc == null || dtNasc == "")
                stmt.setNull(6, java.sql.Types.DATE); // Se for nula ou vazia colocamos um objeto SQL do tipo data com o valor null no campo do statement.
            else
            {
                try {
                    java.sql.Date data = new java.sql.Date(new SimpleDateFormat("dd/MM/yyyy").parse(dtNasc).getTime());
                    System.out.println("Data convertida com sucesso." + data.toString());
                    stmt.setDate(6, data);
                } catch (ParseException ex) {
                    System.out.println("Falha em converter a data.");
                    Logger.getLogger(Usuario.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            stmt.setString(7, "A"); // Como eh um usuario, o campo tipo eh inserido automaticamente como "A"
            stmt.setString(8, ra);
            stmt.setString(9, curso);
            stmt.setString(10, semestre);
            stmt.setNull(11, java.sql.Types.VARCHAR); // Esses campos nao sao necessarios para o aluno, logo sao colocados como null
            stmt.setNull(12, java.sql.Types.VARCHAR);
            stmt.setNull(13, java.sql.Types.VARCHAR);
            stmt.setNull(14, java.sql.Types.VARCHAR);
            stmt.setNull(15, java.sql.Types.VARCHAR);
            System.out.println("Statement preparado com sucesso.");
        } catch (SQLException ex) {
            Logger.getLogger(ConnectionHandler.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Criacao de statement falhou.");
            return false;
        }
        try {
            stmt.executeUpdate();
            System.out.println("Statement executado com sucesso.");
        } catch (SQLException ex) {
            Logger.getLogger(ConnectionHandler.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Falha na execucao do statement.");
            return false;
        }
        return ch.Disconnect();
    }
    
    public boolean novoOutro(String nome, String email, String senha, String cep, String tel, String dtNasc, String empresa, String cargo, String faculdade,
            String graduacao)
    {
        conn = ch.Connect();
        try {
            // Statement SQL
            stmt = conn.prepareStatement("INSERT INTO ADMINDB2.\"Usuario\" (\"Nome\", \"Email\", \"Senha\", \"CEP\", \"Telefone\", \"DataNascimento\", " +
                    "\"Tipo\", \"RA\", \"Curso\", \"Semestre\", \"NoRegistro\", \"Empresa\", \"Cargo\", \"Faculdade\", \"Graduacao\") VALUES(?, " +
                    "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
            
            // Passagem de variaveis
            stmt.setString(1, nome);
            stmt.setString(2, email);
            stmt.setString(3, senha);
            stmt.setString(4, cep);
            stmt.setString(5, tel);
            // Conversao da data de nascimento
            if(dtNasc == null || dtNasc == "")
                stmt.setNull(6, java.sql.Types.DATE); // Se for nula ou vazia colocamos um objeto SQL do tipo data com o valor null no campo do statement.
            else
            {
                try {
                    java.sql.Date data = new java.sql.Date(new SimpleDateFormat("ddMMyyyy").parse(dtNasc).getTime());
                    System.out.println("Data convertida com sucesso." + data.toString());
                    stmt.setDate(6, data);
                } catch (ParseException ex) {
                    System.out.println("Falha em converter a data.");
                    Logger.getLogger(Usuario.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            stmt.setString(7, "E"); // Como eh um usuario, o campo tipo eh inserido automaticamente como "A"
            stmt.setNull(8, java.sql.Types.VARCHAR);
            stmt.setNull(9, java.sql.Types.VARCHAR);
            stmt.setNull(10, java.sql.Types.VARCHAR);
            stmt.setNull(11, java.sql.Types.VARCHAR); // Esses campos nao sao necessarios para o aluno, logo sao colocados como null
            stmt.setString(12, empresa);
            stmt.setString(13, cargo);
            stmt.setString(14, faculdade);
            stmt.setString(15, graduacao);
            System.out.println("Statement preparado com sucesso.");
        } catch (SQLException ex) {
            Logger.getLogger(ConnectionHandler.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Criacao de statement falhou.");
            return false;
        }
        try {
            stmt.executeUpdate();
            System.out.println("Statement executado com sucesso.");
        } catch (SQLException ex) {
            Logger.getLogger(ConnectionHandler.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Falha na execucao do statement.");
            return false;
        }
        return ch.Disconnect();
    }
    
    public boolean novoProfessor(String nome, String email, String senha, String cep, String tel, String dtNasc,String noRegistro)
    {
            conn = ch.Connect();
        try {
            // Statement SQL  
            stmt = conn.prepareStatement("INSERT INTO ADMINDB2.\"Usuario\" (\"Nome\", \"Email\", \"Senha\", \"CEP\", \"Telefone\", \"DataNascimento\", " +
                    "\"Tipo\", \"RA\", \"Curso\", \"Semestre\", \"NoRegistro\", \"Empresa\", \"Cargo\", \"Faculdade\", \"Graduacao\") VALUES(?, " +
                    "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
            // Passagem de variaveis
            stmt.setString(1, nome);
            stmt.setString(2, email);
            stmt.setString(3, senha);
            stmt.setString(4, cep);
            stmt.setString(5, tel);
            // Conversao da data de nascimento
            if(dtNasc == null || dtNasc == "")
                stmt.setNull(6, java.sql.Types.DATE); // Se for nula ou vazia colocamos um objeto SQL do tipo data com o valor null no campo do statement.
            else
            {
                try {
                    java.sql.Date data = new java.sql.Date(new SimpleDateFormat("ddMMyyyy").parse(dtNasc).getTime());
                    System.out.println("Data convertida com sucesso." + data.toString());
                    stmt.setDate(6, data);
                } catch (ParseException ex) {
                    System.out.println("Falha em converter a data.");
                    Logger.getLogger(Usuario.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            stmt.setString(7, "P"); // Como eh um professor, o campo tipo eh inserido automaticamente como "P"
            stmt.setNull(8, java.sql.Types.VARCHAR);
            stmt.setNull(9, java.sql.Types.VARCHAR);
            stmt.setNull(10, java.sql.Types.VARCHAR);
            stmt.setString(11, noRegistro); // Esses campos nao sao necessarios para o aluno, logo sao colocados como null
            stmt.setNull(12, java.sql.Types.VARCHAR);
            stmt.setNull(13, java.sql.Types.VARCHAR);
            stmt.setNull(14, java.sql.Types.VARCHAR);
            stmt.setNull(15, java.sql.Types.VARCHAR);
            System.out.println("Statement preparado com sucesso.");
        } catch (SQLException ex) {
            Logger.getLogger(ConnectionHandler.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Criacao de statement falhou.");
            return false;
        }
        try {
            stmt.executeUpdate();
            System.out.println("Statement executado com sucesso.");
        } catch (SQLException ex) {
            Logger.getLogger(ConnectionHandler.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Falha na execucao do statement.");
            return false;
        }
        return ch.Disconnect();
    }   
    
    /*
     * Metodo para buscar um usuario pelo nome. Recebe uma string com o nome desejado e cria um statement SQL para realizar a busca no banco de dados.
     * Retorna um resultset com os resultados encontrados.
     */
    public ResultSet buscaUsuarioNome(String nome)
    {
        conn = ch.Connect();
        try {
            stmt = conn.prepareStatement("SELECT * FROM ADMINDB2.\"Usuario\" WHERE \"Nome\" = ?", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
            stmt.setString(1, nome);
            System.out.println("Statement preparado com sucesso.");
        } catch (SQLException ex) {
            Logger.getLogger(ConnectionHandler.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Criacao de statement falhou.");
        }
        try {
            rst = stmt.executeQuery();
            System.out.println("Query executada.");
            rst.last();
            System.out.println("Busca executada com sucesso. Encontrados " + rst.getRow() + " usuarios.");
            rst.beforeFirst();
        } catch (SQLException ex) {
            Logger.getLogger(ConnectionHandler.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Falha na execucao do statement.");
        }
        return rst;
    }
    
    public ResultSet getUsuarios()
    {
        conn = ch.Connect();
        try {
            stmt = conn.prepareStatement("SELECT * FROM ADMINDB2.\"Usuario\"", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
            System.out.println("Statement preparado com sucesso.");
        } catch (SQLException ex) {
            Logger.getLogger(ConnectionHandler.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Criacao de statement falhou.");
        }
        try {
            rst = stmt.executeQuery();
            System.out.println("Query executada.");
            rst.last();
            System.out.println("Busca executada com sucesso. Encontrados " + rst.getRow() + " usuarios.");
            rst.beforeFirst();
        } catch (SQLException ex) {
            Logger.getLogger(ConnectionHandler.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Falha na execucao do statement.");
        }
        return rst;
    }
    
    public Usuario()
    {
    }

    public String getNome() {
        return nome;
    }
    
    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCargo() {
        return cargo;
    }

    public void setCargo(String cargo) {
        this.cargo = cargo;
    }

    public String getCurso() {
        return curso;
    }

    public void setCurso(String curso) {
        this.curso = curso;
    }

    public String getDataNascimento() {
        return dataNascimento;
    }

    public void setDataNascimento(String dataNascimento) {
        this.dataNascimento = dataNascimento;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getEmpresa() {
        return empresa;
    }

    public void setEmpresa(String empresa) {
        this.empresa = empresa;
    }

    public String getFaculdade() {
        return faculdade;
    }

    public void setFaculdade(String faculdade) {
        this.faculdade = faculdade;
    }

    public String getGraduacao() {
        return graduacao;
    }

    public void setGraduacao(String graduacao) {
        this.graduacao = graduacao;
    }

    public String getNoRegistro() {
        return noRegistro;
    }

    public void setNoRegistro(String noRegistro) {
        this.noRegistro = noRegistro;
    }

    public String getRa() {
        return ra;
    }

    public void setRa(String ra) {
        this.ra = ra;
    }

    public String getSemestre() {
        return semestre;
    }

    public void setSemestre(String semestre) {
        this.semestre = semestre;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    public String getCep() {
        return cep;
    }

    public void setCep(String cep) {
        this.cep = cep;
    }

    public int getTipoCadastro() {
        return tipoCadastro;
    }

    public void setTipoCadastro(int tipoCadastro) {
        this.tipoCadastro = tipoCadastro;
    }
    
}
